package com.slipper.qmt;

import com.slipper.common.util.GsonUtil;
import com.slipper.qmt.redis.RedisSender;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@Component
public class QmtProxy {
    @Resource
    private RedisSender sender;

    /**
     * 获取合约基础信息
     * @param stockCode 股票代码
     */
    public void getInstrumentDetail(String stockCode) {
        sender.sendMsg("get_instrument_detail", stockCode);
    }

    /**
     * 获取合约类型

     * @param stockCode 股票代码
     */
    public void getInstrumentType(String stockCode) {
        sender.sendMsg("get_instrument_type", stockCode);
    }

    /**
     * 订阅单股行情
     *
     * @param stockCode 股票代码
     */
    public void subscribeQuoteTick(String stockCode) {
        sender.sendMsg("subscribe_quote_tick", stockCode);
    }

    /**
     * 取消订阅单股行情
     *
     * @param subscribeNo 订阅号
     */
    public void unSubscribeQuoteTick(int subscribeNo) {
        sender.sendMsg("un_subscribe_quote_tick", subscribeNo);
    }

    // 查询资金账号对应的资产
    public void queryStockAsset(String account) {
        sender.sendMsg("query_stock_asset", account);
    }

    // 查询资金账号对应的当日所有委托
    public void queryStockOrders(String account) {
        sender.sendMsg("query_stock_orders", account);
    }

    // 查询资金账号对应的当日所有成交
    public void queryStockTrades(String account) {
        sender.sendMsg("query_stock_trades", account);
    }

    // 查询资金账号对应的持仓
    public void queryStockPositions(String account) {
        sender.sendMsg("query_stock_positions", account);
    }

    public void order(
            String accountId, // 资金账号（必填）
            String orderCode, // 下单代码（必填）
            Integer orderType, // 委托类型（必填）
            Integer volume, // 下单数量（股 / 手 / 元 / %）（必填）
            Integer priceType, // 下单选价类型（必填）
            Double price, // 下单价格（必填）
            String strategyName, // 自定义策略名（选填）
            String stockOrderId) { // 用户自设委托 Id（选填），对应callback remark
        Map<String, Object> data = new HashMap<>();
        data.put("accountId", accountId);
        data.put("orderCode", orderCode);
        data.put("orderType", orderType);
        data.put("volume", volume);
        data.put("priceType", priceType);
        data.put("price", price);
        data.put("strategyName", strategyName);
        data.put("stockOrderId", stockOrderId);
        sender.sendMsg("order", GsonUtil.toJson(data));
    }

    public void cancel(String stockOrderId, String accountId, String orderId) {
        Map<String, Object> data = new HashMap<>();
        data.put("stockOrderId", stockOrderId);
        data.put("accountId", accountId);
        data.put("orderId", orderId);
        sender.sendMsg("cancel", GsonUtil.toJson(data));
    }
}
